我正在编写一个自动为我赌博的剧本(我知道,这是一个项目,我不希望赚钱,它反对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上选择它?或者任何其他巧妙的方法来解决这些错误?
答案 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