处理许多不可见的元素

时间:2017-09-19 20:59:59

标签: python selenium

我正在编写一个自动为我赌博的剧本(我知道,这是一个项目,我不希望赚钱,它反对T& Cs)和我决定使用Bet365。我遇到了很多ElementNotVisibleException: Message: element not visible错误。我尝试登录时遇到的第一个因为它不会让我输入密码到密码字段。我通过发送JavaScript命令解决了这个问题:

driver.find_element_by_css_selector("div.hm-Login_UserNameWrapper > input.hm-Login_InputField").send_keys(config.BET365_USERNAME)

driver.execute_script("document.getElementsByClassName('hm-Login_InputField Hidden')[0]"
                      ".setAttribute('value', '" + config.BET365_PASSWORD + "')")

driver.find_element_by_css_selector("body > div:nth-child(1) > div > div:nth-child(1) > div > "
                                    "div.hm-HeaderModule_Primary > div.hm-HeaderModule_UserAdmin > div > "
                                    "div.hm-Login_PasswordWrapper > button").send_keys(Keys.ENTER)

一旦我这样做,我会尝试通过以下方式找到1.33的任何报价:

low_odd = driver.find_elements_by_xpath("//*[contains(text(), '1.33')]")[0]

确实找到了我的元素。当我尝试执行low_odd.click()时,它会给我ElementNotVisibleException错误。

有没有办法获取此low_odd元素的路径,以便我可以发送另一个JavaScipt命令在我的betslip上选择它?或者任何其他巧妙的方法来解决这些错误?

1 个答案:

答案 0 :(得分:0)

Selenium将找到不可见的元素,但不会对它们采取任何操作(点击等会引发错误)。设计是Selenium只对用户可以使用的元素采取行动,例如用户无法点击不可见的元素。

您可以将元素集合过滤到仅显示(可见)的元素。

low_odd = [e for e in driver.find_elements_by_xpath("//*[contains(., '1.33')]") if e.is_displayed()]

然后,一旦你有了过滤后的列表,就可以循环遍历它,然后点击每一个,或者只点击第一个或任何你想要的内容。

注意:上面的代码是未经测试的,我不是一个python的人,所以它可能不完全正确或非常python-y。你可能需要稍微调整一下。

用于过滤参考:https://docs.python.org/3/tutorial/datastructures.html#list-comprehensions