使用哪个 expected_conditions?
Which expected_conditions to use?
我在使用 Python 的 Selenium 的网站上有这个列表。
单击一个项目会打开一个子列表,您可以在其中单击多个按钮。我用 JavaScript 单击这些按钮,这样子列表就永远不会打开。这种方法更快。
...
driver.execute_script(button)
我的问题是我应该使用哪个 expected_conditions 来等待按钮出现在 DOM 中,以便我可以 select 它与 JavaScript?
expected_conditions.element_to_be_clickable
(我一直使用的)不是正确答案。
如果您使用 JavaScript 单击这些元素,则无需等待这些元素的可点击性或可见性,在这种情况下存在就足够了。所以,你可以在这里使用presence_of_element_located
方法。
我建议永远不要使用 JavaScript 点击 Selenium 除非你别无选择,因为 Selenium 正在模拟人类 GUI 活动,在 99.9% 的情况下可以而且应该使用 selenium .click()
方法来完成。如果您不能使用此方法执行此操作,则通常意味着人类将无法通过 GUI 执行此操作,因此这通常不是我们想要使用 Selenium 测试 GUI 功能的目的。
由于您没有扩展项目和子列表不可见,您正在调用 on multiple buttons, WebDriverWait for and 将始终失败.
解决方案
在这种情况下,最好的办法是按如下方式诱导 for the :
element = WebDriverWait(driver, 20).until(expected_conditions.presence_of_element_located((By.XPATH, "element_xpath']")))
driver.execute_script(""arguments[0].click();", element)
在一行中:
driver.execute_script(""arguments[0].click();", WebDriverWait(driver, 20).until(expected_conditions.presence_of_element_located((By.XPATH, "element_xpath']"))))
另一个基于JavaScript的替代方案是:
driver.execute_script("document.getElementsByClassName('theClassName')[0].click()")
我在使用 Python 的 Selenium 的网站上有这个列表。
单击一个项目会打开一个子列表,您可以在其中单击多个按钮。我用 JavaScript 单击这些按钮,这样子列表就永远不会打开。这种方法更快。
...
driver.execute_script(button)
我的问题是我应该使用哪个 expected_conditions 来等待按钮出现在 DOM 中,以便我可以 select 它与 JavaScript?
expected_conditions.element_to_be_clickable
(我一直使用的)不是正确答案。
如果您使用 JavaScript 单击这些元素,则无需等待这些元素的可点击性或可见性,在这种情况下存在就足够了。所以,你可以在这里使用presence_of_element_located
方法。
我建议永远不要使用 JavaScript 点击 Selenium 除非你别无选择,因为 Selenium 正在模拟人类 GUI 活动,在 99.9% 的情况下可以而且应该使用 selenium .click()
方法来完成。如果您不能使用此方法执行此操作,则通常意味着人类将无法通过 GUI 执行此操作,因此这通常不是我们想要使用 Selenium 测试 GUI 功能的目的。
由于您没有扩展项目和子列表不可见,您正在调用
解决方案
在这种情况下,最好的办法是按如下方式诱导
element = WebDriverWait(driver, 20).until(expected_conditions.presence_of_element_located((By.XPATH, "element_xpath']")))
driver.execute_script(""arguments[0].click();", element)
在一行中:
driver.execute_script(""arguments[0].click();", WebDriverWait(driver, 20).until(expected_conditions.presence_of_element_located((By.XPATH, "element_xpath']"))))
另一个基于JavaScript的替代方案是:
driver.execute_script("document.getElementsByClassName('theClassName')[0].click()")