0

我尝试使用 python selenium登录Flipkart网站。

代码:_

from selenium import webdriver
import time

driver = webdriver.Chrome('location to chrome driver')
driver.get('https://www.flipkart.com/')
driver.maximize_window()
driver.implicitly_wait(15)
time.sleep(10)
driver.find_element_by_class_name('_2zrpKA').send_keys(username)
driver.find_element_by_xpath('//input[@type = "{}"]'.format('password')).send_keys(Password)
driver.find_element_by_xpath('//span[contains(text(), "{}")]'.format('login')).click()

使用 执行的代码exit code 0 (No errors),但登录后未获取仪表板页面,登录表单弹出仍然可见。

4

5 回答 5

1

您需要注意以下几个事实:

  • 要最大化Chrome 浏览器而不是maximize_window()始终使用ChromeOptions().
  • 由于网站https://www.flipkart.com/是基于ReactJS WebDriverWait是不可避免的,所以你需要删除所有的实例implicitly_wait()作为文档中的Explicit 和 Implicit Waits提到:

不要implicit混合explicit 等待。这样做会导致不可预测的等待时间。

  • 也删除硬编码time.sleep()
  • 在发送username字符序列之前,您需要诱导WebDriverWait以使所需元素成为可点击的。
  • 这是您自己实现上述更改的代码:

    from selenium import webdriver
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    
    options = webdriver.ChromeOptions() 
    options.add_argument("start-maximized")
    options.add_argument('disable-infobars')
    driver=webdriver.Chrome(chrome_options=options, executable_path=r'C:\Utility\BrowserDrivers\chromedriver.exe')
    driver.get('https://www.flipkart.com/')
    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//span[contains(.,'Enter Email/Mobile number')]//preceding::input[1]"))).send_keys("siva")
    driver.find_element_by_xpath("//span[contains(.,'Enter Password')]//preceding::input[1]").send_keys("narayana")
    driver.find_element_by_xpath("//button[@type='submit']//span[contains(.,'Login')]").click()
    

浏览器快照:

Flipkart_登录

于 2018-07-17T08:51:16.467 回答
0
 public class Flipkart {

public static void main(String[] args) throws InterruptedException
{
  System.setProperty("webdriver.chrome.driver","D:\\chromedriver.exe");

  WebDriver driver=new ChromeDriver();

  driver.get("http://www.flipkart.com/");    

  driver.manage().window().maximize();

  driver.findElement(By.xpath(".//*[@class='_2zrpKA _1dBPDZ']")).sendKeys("naveen@gmail.com");

  driver.findElement(By.xpath(".//*[@class='_2zrpKA _3v41xv _1dBPDZ']")).sendKeys("Hahaha@9090");

  driver.findElement(By.xpath(".//*[@class='_2AkmmA _1LctnI _7UHT_c']")).click();

  Thread.sleep(300);
}
}
于 2019-07-29T07:59:17.527 回答
0

在 Modal 框中,Login as Text 有两个可用的元素。您的 xpath 指向第一个标签登录。因此,您需要如下修改您的 XPath

driver.find_element_by_xpath('//button//span[contains(text(), "{}")]'.format('login')).click()

您的 Xpath 指向红色突出显示的框。但预期的登录是以绿色突出显示的按钮。所以,请//button在您的 xpath 之前添加

在此处输入图像描述

于 2018-07-16T17:27:07.943 回答
0

您的登录按钮xPath不正确。这将起作用:

//button[@type = 'submit']/span

完整的代码是:

from selenium import webdriver
import time

driver = webdriver.Chrome('location to chrome driver')
driver.get('https://www.flipkart.com/')

driver.maximize_window()
driver.implicitly_wait(15)

time.sleep(10)
driver.find_element_by_class_name('_2zrpKA').send_keys(username)
driver.find_element_by_xpath('//input[@type = "{}"]'.format('password')).send_keys(Password)
driver.find_element_by_xpath("//button[@type = 'submit']/span").click()

您还可以使用以下命令代替硬编码暂停WebDriverWait

from selenium import webdriver
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait
import time

driver = webdriver.Chrome('location to chrome driver')
driver.get('https://www.flipkart.com/')
driver.maximize_window()

WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.CLASS_NAME, "_2zrpKA"))).send_keys("username")
driver.find_element_by_xpath('//input[@type = "{}"]'.format('password')).send_keys("password")
driver.find_element_by_xpath("//button[@type = 'submit']/span").click()

这将执行得更快。更多信息可以在这里找到。

于 2018-07-16T17:21:16.913 回答
0

你可以试试这个:

driver = webdriver.Chrome('location to chrome driver')
driver.maximize_window()
driver.get("https://www.flipkart.com/")

username = driver.find_element_by_css_selector("form[autocomplete] input[type='text']")
username.send_keys("username")

password = driver.find_element_by_css_selector("form[autocomplete] input[type='password']")
password.send_keys("password")  

login_button = driver.find_element_by_xpath("//span[text()='Login']/ancestor::button")
login_button.click()

确保导入这些:

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By

您可以引入显式等待(webdriver 等待)。但仅出于登录目的,您不需要。但是,如果您要使 Flipkart 自动化,IMO 您应该明确等待。

于 2018-07-16T17:24:37.110 回答