当我尝试将switch_to_frame()或switch_to.frame()(顺便说一句,哪些是正确的?)转换为不友好的iFrame时,我收到错误。应该支持吗?
def click_all(driver):
for img in imgs:
img.click()
iframes = driver.find_elements_by_tag_name('iframe')
for ifr in iframes:
try:
driver.switch_to.frame(ifr)
except:
e = sys.exc_info()
print "Error: %s" % str(e) # Gives a vague error: '(<class 'selenium.common.exceptions.WebDriverException'>, WebDriverException(), <traceback object at 0x1102a9680>)'
return
click_all(driver)
感谢您的帮助!
堆栈跟踪是:
Traceback (most recent call last):
File "/Users/merrigan/working/DockLion/qe-cordell/test/bases/util.py",
line 45, in click_all
driver.switch_to_window(ifr)
File "/Library/Python/2.7/site-packages/selenium/webdriver/remote/webdriver.py", line 657, in switch_to_window
self._switch_to.window(window_name)
File "/Library/Python/2.7/site-packages/selenium/webdriver/remote/switch_to.py", line 113, in window
self._driver.execute(Command.SWITCH_TO_WINDOW, data)
File "/Library/Python/2.7/site-packages/selenium/webdriver/remote/webdriver.py", line 308, in execute
self.error_handler.check_response(response)
File "/Library/Python/2.7/site-packages/selenium/webdriver/remote/errorhandler.py", line 194, in
check_response
raise exception_class(message, screen, stacktrace)
WebDriverException: Message: unknown error: 'name' must be a string
(Session info: chrome=65.0.3325.181)
(Driver info: chromedriver=2.33.506106
(8a06c39c4582fbfbab6966dbb1c38a9173bfb1a2),platform=Mac OS X 10.12.6 x86_64)
(这是否意味着只有iFrame具有名称属性才有效?)
答案 0 :(得分:1)
是的,您可以将WebElement
传递给switch_to.frame
功能,它会起作用。
离。
driver.switch_to.frame(driver.find_element_by_id('id'))
您上面遇到的问题是由上面的代码中没有的这一行引起的:
self._switch_to.window(window_name)
这需要一个窗口名称或句柄,从而导致您在提供的回溯中出现错误。
如果您仍然遇到问题,请提供相关的 HTML ,以便我们帮助您切换到此框架。
switch_to_frame
现已弃用,请使用switch_to
进行任何切换功能。
在窗口和框架之间切换的文档为HERE,引用switch_to_frame
,但说明仍然与使用相关。
<强>旁注强>
请将您的 Chromedriver 更新为至少 2.36
,因为您运行 Chrome内容版本65 ,但不支持您当前版本的 Chromedriver 2.33
:https://sites.google.com/a/chromium.org/chromedriver/downloads
通过保持最新状态或推荐配对,您将遇到更少的问题,如chromedriver下载登录页面所述。
答案 1 :(得分:1)
使用框架时,您需要考虑以下几点:
id
,name
,class
等属性。要查看上述用例,您必须找出要切换的目标<iframe>
。因此,而不是通过以下方式创建列表:
iframes = driver.find_elements_by_tag_name('iframe')
尝试通过以下任一方法找到您希望与之交互的 WebElements 所在的确切框架:
driver.switch_to.frame("iframe_name") # By Frame Name
driver.switch_to.frame("iframe_id") # By Frame ID
driver.switch_to.frame(frame_index) # By Frame Index
您可以在How can I select a html element no matter what frame it is in in selenium?
中找到详细的讨论 API文档明确提到switch_to_frame()
方法已弃用:
switch_to_frame(frame_reference)
Deprecated use driver.switch_to.frame
使用switch_to.frame()
代替如下:
driver.switch_to.frame(frame_reference)
Returns : SwitchTo an object containing all options to switch focus into
注意:要进行有效的帧切换,您需要将WebDriverWait expected_conditions子句引为frame_to_be_available_and_switch_to_it()
。您可以在小标题A Better Approach to Switch Frames