如果浏览器窗口在bg中,则此行不起作用。
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
# available since 2.4.0
from selenium.webdriver.support.ui import WebDriverWait
# available since 2.26.0
from selenium.webdriver.support import expected_conditions as EC
browser = webdriver.Firefox()
browser.get(someWebPage)
element = WebDriverWait(browser, 10).until(
EC.element_to_be_clickable((By.XPATH, '//button[contains(., "Watch")]')))
elements = browser.find_elements_by_xpath('//button[contains(., "Watch")]')
if elements:
print 'find watch button',elements
elements[0].click()
错误
File "myScript.py", line 1469, in getSignedUrl
EC.element_to_be_clickable((By.XPATH, '//button[contains(., "Watch")]')))
File "C:\Python27\lib\site-packages\selenium\webdriver\support\wait.py", line 71, in until
raise TimeoutException(message)
TimeoutException: Message: ''
但如果我将浏览器窗口留在前面,则不会出错。是因为我不应该使用
EC.element_to_be_clickable
?我试图忽略错误并继续单击我想要的按钮,但它说如果浏览器窗口在后台它找不到按钮。所以我认为我应该做的就是在该行之前,我将浏览器窗口带到前台?
我看到有人在讨论switchTo()
?但是我的浏览器对象没有那种方法。我该怎么做才能将窗口独立地带到前端系统?谢谢
测试系统
python 2.7 windows 7 x64
python 2.6.6 CentOS 6.4
编辑:我试过
browser.execute_script("window.focus();")
和
# commented out EC.element_to_be_clickable as suggested by alecxe
# element = WebDriverWait(browser, 20).until(
# EC.element_to_be_clickable((By.XPATH, '//button[contains(., "Watch")]')))
print 'sleeping 5'
time.sleep(5)
elements = browser.find_elements_by_xpath('//button[contains(., "Watch")]')
print 'before clicking'
from selenium.webdriver.common.action_chains import ActionChains
hover = ActionChains(browser).move_to_element(elements[0])
hover.perform()
print elements
elements[0].click()
不工作
edit2:我查看了文档
class selenium.webdriver.support.expected_conditions.element_to_be_clickable(locator)[source]
An Expectation for checking an element is visible and enabled such that you can click it.
似乎因为当窗口处于bg或最小化时,元素不是“可见的”,所以这个条件永远不会满足? 无论如何我尝试了另一种情况
class selenium.webdriver.support.expected_conditions.presence_of_element_located(locator)[source]
An expectation for checking that an element is present on the DOM of a page. This does not necessarily mean that the element is visible. locator - used to find the element returns the WebElement once it is located
似乎这一个正在发挥作用。以前我尝试完全删除条件,它不起作用可能只是因为我没有“等待”很长时间(睡眠5秒)足够。
edit3:奇怪的是,相同的代码在使用selenium 2.39 python 2.6.6 firefox 28 centos 6.4的计算机上工作正常,即使浏览器窗口最小化也是如此。但相同的代码尝试了另外两台机器失败,浏览器窗口必须最大化,按钮必须“可见” A. win7 x64 firefox 28 selenium 2.41 python2.7 B. Fedora 20 firefox 28 selenium 2.41 python2.7
答案 0 :(得分:5)
要回答原始问题,您需要使用最大化窗口方法让浏览器重新获得焦点并置于前台。 在Python中它应该是这样的:
browser.maximize_window()
答案 1 :(得分:4)
这使我能够将浏览器窗口置于前台。我在Python 3上使用Chlenmedriver在Selenium 3.6.0上进行了测试。
from selenium import webdriver
driver = webdriver.Chrome()
driver.switch_to_window(driver.current_window_handle)
答案 2 :(得分:2)
现在我不做python,但是我在Groovy中解决这个问题的方法如下:
browser.js."alert()"
webdriver.switchTo().alert().accept()
我调用了javascript alert
函数,该函数将窗口置于前台,然后我用webdriver.switchTo().alert().accept()
解除了警报。希望Python中有类似的东西。
希望这有帮助!
答案 3 :(得分:1)
经过测试,可在Python 36中运行
driver1 = webdriver.Chrome()
driver1.get("http://www.python.org")
pyName = driver1.title
pyHandle = driver1.window_handles[0]
driver2 = webdriver.Chrome()
driver2.get("http://www.ruby-lang.org/en")
rubyName = driver2.title
rubyHandle = driver2.window_handles[0]
#driver 2 at this time will be in the foreground
driver1.switch_to.window(pyHandle)
driver1.switch_to_window(driver1.current_window_handle)
编辑:不建议使用switch_to_window,请使用switch_to.window
答案 4 :(得分:0)
开箱即用,selenium不会公开驱动程序进程ID或浏览器hwnd,但它是可能的。 以下是获取hwnd的逻辑
无法在此处发布完整代码,将浏览器放在我面前的完整工作解决方案(C#)
http://www.pixytech.com/rajnish/2016/09/selenium-webdriver-get-browser-hwnd/
答案 5 :(得分:0)
这是一个完整的技巧,但使用Windows 7中的硒远程驱动程序IE,对我来说确实有用。
driver.get("about:blank")
driver.minimize_window()
driver.maximize_window()
driver.minimize_window()
driver.maximize_window()
我发送空白页,然后最小化和最大化两次。似乎导致新创建的IE具有前台焦点。