如何强制Selenium WebDriver点击当前不可见的元素?

djo*_*dal 96 java selenium-webdriver

我正在使用Selenium 2 Java API和FirefoxDriver.当我填写表单时,根据表单输入将复选框添加到页面.

我想使用Selenium模拟这些复选框的点击.该元素在常规浏览器中可见并可用,但selenium断言元素不可见.

"Element is not currently visible and so may not be interacted with"
Run Code Online (Sandbox Code Playgroud)

我可以强制硒忽略元素的不可见状态吗?如何强制Selenium与不可见元素进行交互?

luk*_*eis 101

Selenium通过以下标准确定元素是否可见(使用DOM检查器确定哪些css适用于您的元素,请确保查看计算样式):

  • 能见度!=隐藏
  • display!= none(还针对每个父元素进行检查)
  • 不透明度!= 0(不检查单击元素)
  • 高度和宽度均> 0
  • 对于输入,属性类型!=隐藏

您的元素符合其中一个条件.如果你没有能力改变元素的样式,那么你可以通过javascript强制执行它(自从你说Selenium2 API后就假设WebDriver):

((JavascriptExecutor)driver).executeScript("arguments[0].checked = true;", inputElement);
Run Code Online (Sandbox Code Playgroud)

但这不会触发javascript事件,如果您依赖于该输入的更改事件,您也必须触发它(许多方法都可以这样做,最容易使用该页面上加载的任何javascript库).

能见度检查的来源 -

https://github.com/SeleniumHQ/selenium/blob/master/javascript/atoms/dom.js#L577

WebDriver规范定义了这个 -

https://dvcs.w3.org/hg/webdriver/raw-file/tip/webdriver-spec.html#widl-WebElement-isDisplayed-boolean

  • 只要您可以阅读Javascript,bot.dom.isShown方法就决定了可见性:http://code.google.com/p/selenium/source/browse/trunk/javascript/atoms/dom.js#667 (2认同)
  • @NIleshSharma python直接在驱动程序对象本身上有execute_script方法:driver.execute_script(...) (2认同)

小智 27

有时这意味着页面上有多个元素具有您尝试搜索的相同属性,并且您"正在与错误的对话".

如果您的元素不能通过:id或:name(或:class)唯一标识,则可能会很棘手.

有时通过:xpath搜索元素会有所帮助,在某些情况下甚至是不切实际的.

在这些情况下,您可能必须获取符合条件的所有元素,并通过索引引用正确的元素.它很脏,但它有效.

我正在使用Ruby on Rails应用程序中的Selenium/Watir,所以在我的例子中,例子是:

browser = Watir::Browser.new(:firefox, :profile => "default")       
browser.goto("http://www.google.com/analytics")
# login
browser.divs(:text, "+ New Property").last.click
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助.


myn*_*hno 15

我遇到了类似的问题,但它与视口中不可见的元素有关.我拍了一张截图,发现浏览器窗口太窄,无法看到元素.我做了其中一个并且它有效:

driver.maximize_window()
Run Code Online (Sandbox Code Playgroud)

请参阅:WebDriver.maximize_window()


小智 7

或者您可以使用Selenium Action Class来模拟用户交互 - 例如

    WebDriver = new FirefoxDriver();

    WebElement menu = driver.findElement(By.xpath("")); // the triger event element

    Actions build = new Actions(driver); // heare you state ActionBuider
    build.moveToElement(menu).build().perform(); // Here you perform hover mouse over the needed elemnt to triger the visibility of the hidden
    WebElement m2m= driver.findElement(By.xpath(""));//the previous non visible element
    m2m.click();
Run Code Online (Sandbox Code Playgroud)


小智 6

还有另一种情况,可见元素将被识别为不可见:

  • 当Element被CSS转换时
  • 当元素的父元素被CSS转换时

为了检查你不想与之交互的元素是否已经转换了CSS,在CHROME上执行以下操作:

  1. 开放检查员
  2. 找到有趣的元素(或者更可能是它的父元素,假设为div元素)
  3. 选择"计算"选项卡
  4. 如果有一个参数:webkit-transform:matrix(...)则表示该元素是CSS转换的,并且selenium 2可能无法将其识别为可见元素


ava*_*sen 5

不可见性也可能是由于元素应该缓慢出现的时间.在这种情况下,强制浏览器稍稍等待可能会有所帮助.

例如,请参阅让WebDriver等到元素存在的问题.