【问题标题】:How to use Selenium to click a button in a popup modal box如何使用 Selenium 单击弹出模式框中的按钮
【发布时间】:2019-09-19 20:26:33
【问题描述】:

我正在尝试在 Python 中使用 Selenium 从https://www.seekingalpha.com 中提取一些数据。首页有一个“立即登录/加入”链接。我使用 Selenium 来单击它,这会弹出一个弹出窗口,要求使用另一个“登录”按钮输入登录信息。下面的代码似乎可以输入我的用户名和密码,但我尝试点击“登录”按钮没有得到正确的响应(它点击了弹出框下方的广告。)

我正在使用 Python 3.5。

这是我的代码:

driver = webdriver.Chrome()

url = "https://seekingalpha.com"

driver.get(url)

sleep(5)

driver.find_element_by_xpath('//*[@id ="sign-in"]').click() 

sleep(5)

driver.find_element_by_xpath('//*[@id ="authentication_login_email"]').send_keys("xxxx@gmail.com") 

driver.find_element_by_xpath('//*[@id ="authentication_login_password"]').send_keys("xxxxxxxxx") 

driver.find_element_by_xpath('//*[@id="log-btn"]').click()

非常感谢任何意见/建议。

【问题讨论】:

  • 在密码字段中发送回车键通常有效...
  • 谢谢 pcalkins 和 Trapli。我遵循了您的建议并尝试了两种方法(driver.execute_script 或将 ENTER 键发送到 pw),但都不起作用。我确实注意到,即使我在 driver.get("seekingalpha.com") 启动的浏览器中手动单击“登录”按钮,也没有响应。但是,如果我在 Chrome 浏览器中手动打开 seekalpha.com,并手动弹出身份验证弹出窗口,然后手动单击“登录”按钮,它响应了。这是为什么?我是否需要以某种方式将模拟控件设置为弹出窗口?

标签: python selenium web-scraping modal-dialog click


【解决方案1】:

编辑:之前的“答案”是错误的,所以我已经更新了。

知道了,这就是你需要做的:
1.) 获取最新的 firefox
2.) 获取最新的 geckodriver
3.) 使用 Firefox 驱动程序

driver = webdriver.Firefox(executable_path=r'd:\Python_projects\geckodriver.exe')

url = "https://seekingalpha.com"

driver.get(url)

sign_in = driver.find_element_by_xpath('//*[@id ="sign-in"]')
driver.execute_script('arguments[0].click()', sign_in)
time.sleep(1)

email = driver.find_element_by_xpath('//*[@id ="authentication_login_email"]')
email.send_keys("xxxx@gmail.com")
pw = driver.find_element_by_xpath('//*[@id ="authentication_login_password"]')
pw.send_keys("xxxxxxxxx")
pw.send_keys(Keys.ENTER)

说明:

浏览器tells that information是否使用selenium很容易检测(而且似乎这个页面不想被抓取):

导航器界面的 webdriver 只读属性指示用户代理是否由自动化控制。

我一直在寻找如何绕过检测的答案并找到this 文章。

在使用 Selenium 时,您最好避免检测到您需要使用最新版本的 Firefox 之一,该版本似乎不会发出任何明显迹象表明您正在使用 Firefox。

试一试,启动后加载了正确的页面设计,登录尝试的结果与手动尝试相同。

另外,通过更多搜索发现if you modify your chromedriver,即使使用 chromedriver,您也有机会绕过检测。

今天也学到了一些新东西。 \o/

另一个想法:

我使用嵌入式铬 (CEF) 做了一个小实验。如果您通过 selenium 打开 chrome 窗口并打开控制台并检查 navigator.webdriver,结果将是 True。但是,如果您打开 CEF 窗口然后对其进行远程调试,则标志将为 False。我没有用它检查边缘情况,但非边缘情况使用 CEF 应该没问题。

那么您将来可能想要查看的内容:

1.) 在命令行中:pip install cefpython3
2.) git clone https://github.com/cztomczak/cefpython.git
3.) 打开您的 CEF 项目并在示例中找到 hello.py
4.) 将启动更新为cef.Initialize(settings={"remote_debugging_port":9222})
5.) 运行hello.py
(这是最初的一次设置,您将来可以自定义它,但主要的事情已经完成,您有一个打开调试端口的浏览器)
6.) 修改chrome启动为:

from selenium.webdriver.chrome.options import Options

chrome_options = Options()
chrome_options.debugger_address = "127.0.0.1:9222"
driver = webdriver.Chrome(chrome_options=chrome_options, executable_path=chrome_driver_executable)

7.) 现在您在浏览器中有一个没有“自动”签名的驱动程序。可能会有一些缺点,例如:

  • CEF不是超级最新,目前最新发布的chrome是v76,CEF是v66。
  • “某些东西”也可能不起作用,例如 window.Notification 不是 CEF 中的东西

【讨论】:

  • 谢谢 pcalkins 和 Trapli。我遵循了您的建议并尝试了两种方法(driver.execute_script 或将 ENTER 键发送到 pw),但都不起作用。我确实注意到,即使我在 driver.get("seekingalpha.com") 启动的浏览器中手动单击“登录”按钮,也没有任何响应。但是,如果我在 Chrome 浏览器中手动打开 seekalpha.com,并手动弹出身份验证弹出窗口,然后手动单击“登录”按钮,它就会响应。这是为什么?我是否需要以某种方式将模拟控件设置为弹出窗口?
  • @Trapli 非常感谢!!!这很好用。而且比修改chromedriver简单多了。
  • @Trapli,“chrome_options = Options()”行中的 options() 是什么?谢谢。
  • @BinChen from selenium.webdriver.chrome.options import Options
  • 也加入回答
【解决方案2】:

我尝试了您提供的代码,它工作正常。我添加了 selenium 等待只是为了检查其他选项,这些选项也很好用,我更改了 2 行而不是 sleeps

driver.get(url)
wait = WebDriverWait(driver, 10)
signin = wait.until(EC.element_to_be_clickable((By.XPATH, "//*[@id ='sign-in']")))
#sleep(5)

signin.click()

#driver.find_element_by_xpath('//*[@id ="sign-in"]').click()

#sleep(5)
wait.until(EC.element_to_be_clickable((By.XPATH, "//*[@id ='authentication_login_email']")))
driver.find_element_by_xpath('//*[@id ="authentication_login_email"]').send_keys("xxxx@gmail.com")

它确实点击了Sign in 按钮。当我点击登录按钮后检查控制台时,我发现网站上有验证码处理,它讲述了这个故事。我继续将用户代理添加到您的脚本中,但效果不佳。请注意以下屏幕截图中响应登录 API 和控制台错误的 blockscript 参数。但是 ui 上没有验证码 -

【讨论】:

  • 答案中提到的每个方面都非常完美。虽然阻塞问题对我来说仍然没有定论。
  • @DebanjanB 当脚本点击登录按钮时,用户界面上没有错误消息并且显示没有变化
  • 正确,我不知道为什么 Chrome 会抱怨 ...资源被解释为文档但以 mime 类型的图像/gif 传输...,仍然一无所知。
  • @dev 感谢您指出我完全误解了这个问题。更彻底地检查页面后,即使页面设计也因打开方式而异。
  • @dev 感谢您诊断原因。很棒的发现!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-07
  • 2018-04-02
  • 1970-01-01
  • 2021-05-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多